<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>观察者模式</title>
</head>
<body>

</body>
</html>

<script>
  /*
  * 发布订阅模式
  * */

  // let { a = 1, b = 2 } = {}
  // console.log('a:', a)
  //
  // let map = {
  //   '1': 'q',
  //   '2': 'w',
  //   '3': 'e',
  //   '4': 'r'
  // }
  //
  // let arr = [1, 2, 3, 4]
  // let arr1 = arr.map(e => map[e])
  // console.log('arr:', arr1)

  // let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&id=789&id=357&city=%E5%8C%97%E4%BA%AC&enabled&id=789&id'
  // let arr = url.split('?')[1].split('&')
  // let arr1 = arr.reduce((q, w) => {
  //   let itemList = w.split('=')
  //   itemList[1] = itemList[1] ? itemList[1] : true
  //   if (q[itemList[0]]) {
  //     (q[itemList[0]] = [].concat(q[itemList[0]])).push(itemList[1])
  //   } else {
  //     q[itemList[0]] = itemList[1]
  //   }
  //   return q
  // }, {})

  const Event = (
    function () {
      let list = {}, listen, trigger, remove
      listen = function(key,fn){
        if(!list[key]) {
          list[key] = [];
        }
        list[key].push(fn);
      };
      trigger = function(){
        var key = Array.prototype.shift.call(arguments),
            fns = list[key];
        if(!fns || fns.length === 0) {
          return false;
        }
        for(var i = 0, fn; fn = fns[i++];) {
          fn.apply(this,arguments);
        }
      };
      remove = function(key,fn){
        var fns = list[key];
        if(!fns) {
          return false;
        }
        if(!fn) {
          fns && (fns.length = 0);
        }else {
          for(var i = fns.length - 1; i >= 0; i--){
            var _fn = fns[i];
            if(_fn === fn) {
              fns.splice(i,1);
            }
          }
        }
      };
      return {
        listen: listen,
        trigger: trigger,
        remove: remove
      }
    }
  )()

  // 订阅：
  Event.listen("color",function(size) {
    console.log("尺码为:"+size); // 打印出尺码为42
  });

  // 发布
  Event.trigger("color",42);
</script>
